package com.xxxtea.config.converter;

import com.xxxtea.common.BaseEnum;
import org.jetbrains.annotations.NotNull;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;

/**
 * 字符串转枚举类型转换工厂
 * 
 * 用于Spring参数绑定时，将字符串自动转换为BaseEnum类型的枚举对象。
 * 支持通过枚举的value字段进行匹配，适用于表单、URL参数等场景。
 * 
 * @author badman
 * @since 1.0.0
 */
public class StringToEnumConverterFactory implements ConverterFactory<String, Enum<?>> {

	/**
	 * 获取字符串到指定枚举类型的转换器
	 * 
	 * @param targetType 目标枚举类型
	 * @return 转换器
	 */
	@NotNull
	@Override
	public <T extends Enum<?>> Converter<String, T> getConverter(@NotNull Class<T> targetType) {
		return new StringToEnumConverter<>(targetType);
	}

	/**
	 * 字符串转枚举转换器
	 * 支持BaseEnum类型的枚举，通过value字段进行匹配
	 */
	private static class StringToEnumConverter<T extends Enum<?>> implements Converter<String, T> {
		private final Class<T> enumType;

		public StringToEnumConverter(Class<T> enumType) {
			this.enumType = enumType;
		}

		@Override
		public T convert(String source) {
			if (source.isEmpty() || !BaseEnum.class.isAssignableFrom(enumType)) {
				return null;
			}

			// 遍历枚举值，匹配value字段
			for (T enumConstant : enumType.getEnumConstants()) {
				BaseEnum<?> baseEnum = (BaseEnum<?>) enumConstant;
				if (baseEnum.getValue().toString().equals(source)) {
					return enumConstant;
				}
			}
			return null;
		}
	}
}